# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isValidBST(self, root):
        """
https://leetcode.cn/problems/validate-binary-search-tree/submissions/376779062/

给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下：

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

        :type root: TreeNode
        :rtype: bool
        """
        def is_valid(root, left, right):
            if not root:
                return True
            if left < root.val < right:
                return is_valid(root.left, left, root.val) and is_valid(root.right, root.val, right)
            return False

        return is_valid(root, -2**31-1, 2**31)